package com.kira.scaffoldmvc;

import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.InitOptions;
import com.alibaba.qlexpress4.QLOptions;
import com.kira.scaffoldmvc.QLExpression.complex.HelloFunction;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Collections;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * 演示QLExpress中自定义函数与外部参数传递的测试类
 * 通过@SpringBootTest注解启用Spring Boot测试环境
 */
@SpringBootTest
public class MyComplexMethod {

    /**
     * 测试方法：验证自定义函数如何通过QLExpress的执行选项接收外部参数
     * 重点展示了attachments机制在函数与外部环境间传递信息的用法
     */
    @Test
    void test(){
        // 创建QLExpress表达式执行器，使用默认初始化配置
        // Express4Runner是线程安全的，建议在实际应用中复用实例
        Express4Runner express4Runner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);

        // 向执行器注册自定义函数：函数名为"hello"，实现类为HelloFunction
        // 这里假设HelloFunction是一个自定义的函数实现，用于处理"hello()"表达式
        express4Runner.addFunction("hello", new HelloFunction());

        // 执行表达式"hello()"，并通过QLOptions传递外部参数（tenant=jack）
        // 1. QLOptions.builder()：构建执行选项对象
        // 2. attachments(...)：设置附加参数（键值对集合），用于向自定义函数传递外部信息
        // 3. 此处通过attachments传递租户信息"jack"，模拟实际场景中的上下文参数（如用户、租户等）
        String resultJack = (String)express4Runner.execute(
                "hello()",  // 要执行的表达式
                Collections.emptyMap(),  // 上下文变量（本次执行无额外变量）
                QLOptions.builder()
                        .attachments(Collections.singletonMap("tenant", "jack"))  // 附加参数：租户=jack
                        .build()
        ).getResult();  // 获取执行结果

        // 断言：验证函数返回结果是否为预期的"hello,jack"
        assertEquals("hello,jack", resultJack);

        // 重复执行表达式，但传递不同的附加参数（tenant=lucy）
        // 演示通过修改attachments，在不改变表达式的情况下，让函数返回不同结果
        String resultLucy = (String)express4Runner
                .execute(
                        "hello()",  // 同样的表达式
                        Collections.emptyMap(),  // 同样的上下文变量
                        QLOptions.builder()
                                .attachments(Collections.singletonMap("tenant", "lucy"))  // 附加参数：租户=lucy
                                .build()
                )
                .getResult();

        // 断言：验证函数返回结果是否为预期的"hello,lucy"
        assertEquals("hello,lucy", resultLucy);
    }
}